#!/bin/bash
# Script para configurar un equipo fisico como host a, b, c, webserver, telnet server o ftp server
function configurar_ethernet() {
	ifconfig $dispositivo_red $1 netmask $2
}

function configurar_tap() {
	ifconfig $1 $2 netmask $3
}

function establecer_tunel() {
	openvpn --proto udp --rport $1 --lport $2 --remote $IP_PC_GNS3 --dev $3 --tun-mtu 1500 > openvpn_$CONFIGURANDO.log &
	sleep 5
}

# Inicio del script
. ./constantes.sh
. ./f_auxiliares.sh

# Se verifica que se tenga los permisos necesarios
chequear_usuario_root

# Dispositivo fisico de red a utilizar en la configuracion
dispositivo_red=$(get_interfaz_red)
log "Interfaz a utilizar: $dispositivo_red"

# Se otorgan permisos de ejecucion para los archivos
hacer_ejecutables

# Se ejecuta script para realizar backups
#backup_config/realizar_backup.sh

# Se eliminan todas las instancias activas de openvpn
kill_openvpn 2> /dev/null
sleep 5

# Se eliminan todas las entradas de la tabla de ruteo
eliminar_tabla_de_ruteo

case $1 in
	a|A)
	#-----------------------------------------------------#
	#-------------- Configuracion de host A --------------#
	#-----------------------------------------------------#

	CONFIGURANDO=hosta

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_HOSTA $MASK_PC_HOSTA
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Estableciendo tunel"
	establecer_tunel $GNS3_PORT_HOSTA $HOSTA_PORT tap0
	

	# Configura interfaz tap
	log "Configurando interfaz tap"
	configurar_tap tap0 $IP_HOSTA $MASK_HOSTA

	# Configurar la tabla de ruteo
	# TODO: hacer un poquito mas robusta esta llamada: si le paso a minuscula no anda nada
	# Recordar: la tabla de ruteo no se puede configurar si la interfaz tap no esta levantada
	log "Configurando tabla de ruteo"
	./configurar_tabla_ruteo.sh A tap0

	# Agrega la red del GNS3 donde esta la pc fisica
	log "Agregando ruta para conexion con GNS3"
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red

	# Configurar el DNS de la pc
	log "Configurando el servidor DNS a utilizar"
	echo "nameserver $SERVIDOR_DNS_PARA_HOSTA" > /etc/resolv.conf

	log "Fin de configuracion de $1"
	;;

	b|B)
	#-----------------------------------------------------#
	#-------------- Configuracion de host B --------------#
	#-----------------------------------------------------#

	CONFIGURANDO=hostb

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz y direccion de broadcast
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_HOSTB $MASK_PC_HOSTB
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Estableciendo tunel"
	establecer_tunel $GNS3_PORT_HOSTB $HOSTB_PORT tap0

	# Configura interfaz tap
	log "Configurando interfaz tap"
	configurar_tap tap0 $IP_HOSTB $MASK_HOSTB

	# Configurar la tabla de ruteo
	# TODO: hacer un poquito mas robusta esta llamada: si le paso a minuscula no anda nada
	log "Configurando tabla de ruteo"
	./configurar_tabla_ruteo.sh B tap0

	# Agrega la red del GNS3 donde esta la pc fisica
	log "Agregando ruta para conexion con GNS3"
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red

	# Configurar el DNS de la pc
	log "Configurando el servidor DNS a utilizar"
	echo "nameserver $SERVIDOR_DNS_PARA_HOSTB" > /etc/resolv.conf

	log "Fin de configuracion de $1"
	;;

	c|C)
	#-----------------------------------------------------#
	#-------------- Configuracion de host C --------------#
	#-----------------------------------------------------#

	CONFIGURANDO=hostc

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz y direccion de broadcast
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_HOSTC $MASK_PC_HOSTC
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Estableciendo tunel"
	establecer_tunel $GNS3_PORT_HOSTC $HOSTC_PORT tap0

	# Configura interfaz tap
	log "Configurando interfaz tap"
	configurar_tap tap0 $IP_HOSTC $MASK_HOSTC

	# Configurar la tabla de ruteo
	log "Configurando tabla de ruteo"
	# TODO: hacer un poquito mas robusta esta llamada: si le paso a minuscula no anda nada
	./configurar_tabla_ruteo.sh C tap0

	# Agrega la red del GNS3 donde esta la pc fisica
	log "Agregando ruta para conexion con GNS3"
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red

	# Configurar el DNS de la pc
	log "Configurando el servidor DNS a utilizar"
	echo "nameserver $SERVIDOR_DNS_PARA_HOSTC" > /etc/resolv.conf

	log "Fin de configuracion de $1"
	;;

	webserver|WEBSERVER)
	#-----------------------------------------------------#
	#------------ Configuracion del webserver ------------#
	#-----------------------------------------------------#

	CONFIGURANDO=webserver

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz y direccion de broadcast
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_WEBSERVER $MASK_PC_WEBSERVER
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Estableciendo tunel"
	establecer_tunel $GNS3_PORT_WEBSERVER $WEBSERVER_PORT tap0

	# Configura interfaz tap
	log "Configurando interfaz tap"
	configurar_tap tap0 $IP_WEBSERVER $MASK_WEBSERVER

	# Configurar la tabla de ruteo
	log "Configurando tabla de ruteo"
	# TODO: hacer un poquito mas robusta esta llamada: si le paso a minuscula no anda nada
	./configurar_tabla_ruteo.sh WEBSERVER tap0

        # Se inicia el servicio de webserver
	log "Iniciando el servicio de webserver"
        /etc/init.d/apache2 start

	# Agrega la red del GNS3 donde esta la pc fisica
	log "Agregando ruta para conexion con GNS3"
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red

	# Configurar el DNS de la pc
	log "Configurando el servidor DNS a utilizar"
        #echo "nameserver 10.118.5.31" > /etc/resolv.conf
	echo "nameserver $SERVIDOR_DNS_PARA_WEBSERVER" > /etc/resolv.conf
    
    log "Copiando index.html"
    cp index.html /var/www/

	log "Fin de configuracion de $1"
	;;

	ftpserver|FTPSERVER)
	#-----------------------------------------------------#
	#----------- Configuracion de host ftpserver ----------#
	#-----------------------------------------------------#

	CONFIGURANDO=ftpserver

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz y direccion de broadcast
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_FTPSERVER $MASK_PC_FTPSERVER
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Estableciendo tunel"
	establecer_tunel $GNS3_PORT_FTPSERVER $FTPSERVER_PORT tap0

	# Configura interfaz tap
	log "Configurando interfaz tap"
	configurar_tap tap0 $IP_FTPSERVER $MASK_FTPSERVER


	# Configurar la tabla de ruteo
	# TODO: hacer un poquito mas robusta esta llamada: si le paso a minuscula no anda nada
	log "Configurando tabla de ruteo"
	./configurar_tabla_ruteo.sh FTPSERVER tap0


        # Se inicia el servicio de ftpserver
	log "Iniciando el servicio de ftpserver"
        start vsftpd

	# Agrega la red del GNS3 donde esta la pc fisica
	log "Agregando ruta para conexion con GNS3"
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red

	# Configurar el DNS de la pc
	log "Configurando el servidor DNS a utilizar"
	#echo "nameserver 10.19.2.2" > /etc/resolv.conf
	echo "nameserver $SERVIDOR_DNS_PARA_FTPSERVER" > /etc/resolv.conf

	cp vsftpd.conf /etc

	log "Fin de configuracion de $1"
	;;

	telnetserver|TELNETSERVER)
	#-----------------------------------------------------#
	#--------- Configuracion de host telnetserver---------#
	#-----------------------------------------------------#
	#TODO FALTA ARREGLAR PROBLEMAS CON LAS DOS IPS DEL TELNETSERVER
	CONFIGURANDO=telnetserver

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz y direccion de broadcast
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_TELNETSERVER $MASK_PC_TELNETSERVER
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Estableciendo tunel para telnet superior (la que da a la red I)"
	CONFIGURANDO=telnetserver_sup
	establecer_tunel $GNS3_PORT_TELNET_SUP $TELNET_SUP_PORT tap0

	log "Estableciendo tunel para telnet inferior (la que da a la red J)"
	CONFIGURANDO=telnetserver_inf
	establecer_tunel $GNS3_PORT_TELNET_INF $TELNET_INF_PORT tap1

	# Configura interfaz tap
	log "Configurando interfaz tap para telnet superior (la que da a la red I)"
	configurar_tap tap0 $IP_TELNET_SUP $MASK_TELNET_SUP

	log "Configurando interfaz tap para telnet superior (la que da a la red J)"
	configurar_tap tap1 $IP_TELNET_INF $MASK_TELNET_INF

	# Configurar la tabla de ruteo
	chmod 666 /etc/iproute2/rt_tables
	echo 2 tablai >> /etc/iproute2/rt_tables
	echo 3 tablaj >> /etc/iproute2/rt_tables

	log "Configurando tabla de ruteo para telnet superior (la que da a la red I)"
	./configurar_tabla_ruteo.sh TELNETSERVER_SUP tap0
	# Se agrega la ruta para salir por la red I
	ip route add $RED_I/$(convertir_mask $MASK_RED_I) dev tap0 table tablai

	log "Configurando tabla de ruteo para telnet inferior (la que da a la red J)"
	./configurar_tabla_ruteo.sh TELNETSERVER_INF tap1
	# Se agrega la ruta para salir por la red J	
	ip route add $RED_J/$(convertir_mask $MASK_RED_J) dev tap1 table tablaj

	# Se borran las reglas para todas las tablas
	ip rule flush

	# Se agregan reglas por defecto
	ip rule add table main prio 32766
	ip rule add table default prio 32767


	# Se agregan las reglas del telnet
	ip rule add from $IP_TELNET_SUP lookup tablai prio 1001
	ip rule add to $IP_TELNET_SUP lookup tablai prio 1002
	ip rule add from $IP_TELNET_INF lookup tablaj prio 1003
	ip rule add to $IP_TELNET_INF lookup tablaj prio 1004

	ip rule add table tablai prio 1101
	ip rule add table tablaj prio 1102

        # Se inicia el servicio de telnetserver
	log "Iniciando el servicio de telnet"
        /etc/init.d/openbsd-inetd start

	# Deshabilitar chequeo de martian source
	#sysctl net.ipv4.conf.tap0.rp_filter=0
	#sysctl net.ipv4.conf.tap1.rp_filter=0

	# Agrega la red del GNS3 donde esta la pc fisica
	log "Agregando ruta para conexion con GNS3"
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red

	# Configurar el DNS de la pc
	log "Configurando el servidor DNS a utilizar"
	# TODO: cambiar la direccion por una constante usada en el archivo de constantes
        #echo "nameserver 10.19.2.2" > /etc/resolv.conf
	echo "nameserver $SERVIDOR_DNS_PARA_TELNETSERVER" > /etc/resolv.conf


	log "Fin de configuracion de $1"
	;;
    dns1|DNS1)
	#-----------------------------------------------------#
	#-------------- Configuracion de dns 1 ---------------#
	#-----------------------------------------------------#

	CONFIGURANDO=dns1

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_DNS1 $MASK_PC_DNS1
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Configurando tunel"
	establecer_tunel $GNS3_PORT_DNS1 $DNS1_PORT tap0

	# Configura interfaz tap
	log "Configurando interfaz tap"
	configurar_tap tap0 $IP_DNS1 $MASK_DNS1


	# Configurar la tabla de ruteo
	# TODO: hacer un poquito mas robusta esta llamada: si le paso a minuscula no anda nada
	# Recordar: la tabla de ruteo no se puede configurar si la interfaz tap no esta levantada
	./configurar_tabla_ruteo.sh DNS1 tap0

	# Agrega la red del GNS3 donde esta la pc fisica
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red

	# Configuracion de DNS
	log "Configurando el servidor DNS a utilizar"
	
	#echo "nameserver $IP_PC_DNSROOT" > /etc/resolv.conf
	echo "nameserver 127.0.0.1" > /etc/resolv.conf

	log "Iniciando el servicio de DNS1"
	cp -r dns/dns1/* /etc/bind
	/etc/init.d/bind9 restart

	log "Fin de configuracion de $1"
	;;
    
    dns2|DNS2)
	#-----------------------------------------------------#
	#-------------- Configuracion de dns 2 ---------------#
	#-----------------------------------------------------#

	CONFIGURANDO=dns2

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_DNS2 $MASK_PC_DNS2
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Configurando tunel"
	establecer_tunel $GNS3_PORT_DNS2 $DNS2_PORT tap0

	# Configura interfaz tap
	log "Configurando interfaz tap"
	configurar_tap tap0 $IP_DNS2 $MASK_DNS2


	# Configurar la tabla de ruteo
	# TODO: hacer un poquito mas robusta esta llamada: si le paso a minuscula no anda nada
	# Recordar: la tabla de ruteo no se puede configurar si la interfaz tap no esta levantada
	./configurar_tabla_ruteo.sh DNS2 tap0

	# Agrega la red del GNS3 donde esta la pc fisica
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red
    
	# Configuracion de DNS
	log "Configurando el servidor DNS a utilizar"
	#echo "nameserver $IP_PC_DNSROOT" > /etc/resolv.conf
	echo "nameserver 127.0.0.1" > /etc/resolv.conf

	log "Iniciando el servicio de DNS2"
	cp -r dns/dns2/* /etc/bind
	/etc/init.d/bind9 restart

	log "Fin de configuracion de $1"
	;;
    
    dnsroot|DNSROOT)
	#-----------------------------------------------------#
	#-------------- Configuracion de dns root ------------#
	#-----------------------------------------------------#

	CONFIGURANDO=dnsroot

	# Configura interfaz ethernet: ip, mascara de subred de la interfaz
	log "Configurando $dispositivo_red"
	configurar_ethernet $IP_PC_DNSROOT $MASK_PC_DNSROOT
	
	# Establece tunel usando openvpn: puerto remoto, puerto local, interfaz tap
	log "Configurando tunel"
	establecer_tunel $GNS3_PORT_DNSROOT $DNSROOT_PORT tap0

	# Configura interfaz tap
	log "Configurando interfaz tap"
	configurar_tap tap0 $IP_DNSROOT $MASK_DNSROOT


	# Configurar la tabla de ruteo
	# TODO: hacer un poquito mas robusta esta llamada: si le paso a minuscula no anda nada
	# Recordar: la tabla de ruteo no se puede configurar si la interfaz tap no esta levantada
	./configurar_tabla_ruteo.sh DNSROOT tap0

	# Agrega la red del GNS3 donde esta la pc fisica
	route add -net $IP_RED_PC_FISICAS netmask $MASK_RED_PC_FISICAS dev $dispositivo_red
    
	# Configuracion de DNS
	log "Configurando el servidor DNS a utilizar"
	#echo "nameserver 127.0.0.1" > /etc/resolv.conf
	echo "nameserver $SERVIDOR_DNS_PARA_DNSROOT" > /etc/resolv.conf

	log "Iniciando el servicio de DNS ROOT"
	cp -r dns/dnsroot/* /etc/bind
	/etc/init.d/bind9 restart

	log "Fin de configuracion de $1"
	;;

	*)
		echo "Se debe correr el script con la opcion a, b, c, dns1, dns2, dnsroot, telnetserver, webserver, ftpserver"
	;;
esac


